1

时间:2017年12月07日星期四
说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十九章学习总结

第十九章:初识sed和gawk

本章内容

  • 学习sed编辑器
  • gawk编辑器入门
  • sed编辑器基础

19.1 文本处理

19.1.1 sed编辑器

sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。sed编辑器可以根据命令来处理数据流中的数据。

sed编辑器会执行下列操作

  • 一次从输入中读取一行数据
  • 根据所提供的编辑器命令匹配数据
  • 按照命令修改流中的数据
  • 将新的数据输出到STDOUT

在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复以上过程,直到处理完所有数据行。

sed命令格式

sed options script file

使用选项修改sed命令的行为,sed命令选项如下

  • -e script:在处理输入时,将script中指定的命令添加到已有的命令中
  • -f file:在处理输入时,将file中指定的命令添加到已有的命令中
  • -n:不产生命令输出,使用print命令来完成输出

1.在命令行定义编辑器命令

默认情况下,sed编辑器会将指定的命令应用到STDIN输入流上,可以直接将数据通过管道输入sed编辑器进行处理。

简单示例

echo "This is a test" | sed 's/test/big test/'

在该例子中使用了sed编辑器的s命令。s命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串。这个例子中是big test替换了test

对文件进行处理

编写data1.txt文件

The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.

执行命令

sed 's/dog/cat/' data1.txt

sed编辑器并不会修改文本文件的数据

2.在命令行使用多个编辑器命令

在sed命令上使用-e选项实现执行多个命令

sed -e 's/brown/green/;s/dog/cat/' data1.txt

3.从文件中读取编辑器命令

编写script1.sed文件

s/brown/green/
s/fox/elephant/
s/dog/cat/

执行命令

sed -f script1.sed data1.txt

敲门:为了避免把sed编辑器脚本文件与bash shell脚本文件搞混,可以使用.sed作为sed脚本文件的扩展名

19.1.2 gakw程序

gawk程序是Unix中的原始awk程序GNU版本,使用gawk程序可以实现

  • 定义变量来保存数据
  • 使用算术和字符串操作符来处理数据
  • 使用结构化编程概念来为数据处理增加处理逻辑
  • 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告

1.gawk命令格式

命令格式

gawk options program file

gawk可用的options选项

  • 选项:描述
  • -F fs:指定行中划分数据字段的字段分隔符
  • -f file:从指定的文件中读取程序
  • -v var=value:定义gawk程序中的一个变量及其默认值
  • -mf N:指定要处理的数据文件中的最大字段树
  • -mr N:指定数据文件中的最大数据行树
  • -W keyword:指定gawk的兼容模式或警告等级

2.从命令行读取程序脚本

一个简单的gawk程序脚本

gawk '{print "Hello World!"}'

运行该命令后,会一直等待STDIN输入的文本。而不管在数据流中输入什么文本,都会输出同样的文本,可以使用Ctrl+D终止程序

3.使用数据字段变量

gawk的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据元素分配一个变量。默认情况下,它会如下分配

  • $0代表整个文本行
  • $1代表文本行中的第1个数据字段
  • $2代表文本行中的第2个数据字段
  • $n代表文本行中的第n个数据字段

gawk在读取一行文本时,会使用默认的字段分隔符(空白字符:空格或制表符)来划分每个数据字段

编写data2.txt文件

One line of test text.
Two lines of test text.
Three lines of test text.

执行命令

gawk '{print $1}' data2.txt

则只显示第1个数据字段的值

可以使用-F选项指定字段分隔符

执行命令

gawk -F: '{print $1}' /etc/passwd

4.在程序脚本中使用多个命令

只要在命令之间放个分好即可

实例

echo "My name is zc" | gawk '{$4="test";print $0}'

5.从文件中读取程序

编写script2.gawk文件

{print $1 "'s home directory is " $6}

执行命令

gawk -F: -f script2.gawk /etc/passwd

或使用以下方式

编写script3.gawk文件

{
text = "'s home directory is "
print $1 text $6
}

执行命令

gawk -F: -f script3.gawk /etc/passwd

6.在处理数据前运行脚本

使用BEHIN关键字强制gawk在读取数据前执行指定的程序脚本

gawk 'BEGIN {print "Hello World!"}'

编写data3.txt文件

Line 1
Line 2
Line 3

执行命令

gawk 'BEGIN {print "The data3 File Contents:"} {print $0}' data3.txt

7.在处理数据后运行脚本

使用END关键字gawk在读完数据后执行程序脚本

gawk 'BEGIN {print "The data3 File Contents:"} {print $0} END {print "End of File"}' data3.txt

编写script4.gawk文件

BEGIN {
print "The latest list of users and shells"
print " UserID \t Shell"
print "------- \t -------"
FS=":"
}

{
print $1 " \t " $7
}

END {
print "This concludes the listing"
}

执行命令

gawk -f script4.gawk /etc/passwd

19.2 sed编辑器基础

19.2.1 更多的替换选项

1.替换标记

使用s命令默认只会替换每行中第一处出现的地方,如果需要替换所有出现的地方,则需要使用替换标记

可用的替换标记

  • 数字:表明新文本将替换第几处模式匹配的地方
  • g:表明新文本将会替换所有匹配的文本
  • p:表明原先行的内容要打印出来
  • w file:将替换的结果写到文件中

编写data4.txt文件

This is a test of the test script.
This is the second test of the test script.

执行命令

sed 's/test/trial/2' data4.txt
sed 's/test/trial/g' data4.txt

编写data5.txt文件

This is a test line.
This is a different line.

执行命令

sed -n 's/test/trial/p' data5.txt
sed 's/test/trial/w test.txt' data5.txt
cat test.txt

2.替换字符

执行命令

sed 's!/bin/bash!/bin/csh!' /etc/passwd

19.2.2 使用地址

sed编辑器默认会将使用的命令作用于文本数据的所有行,使用行寻址,可以指定作用于特定行或某些行

行寻址的两种形式

  • 以数字形式表示行区间
  • 用文本模式来过滤出行

两种形式的命令格式相同

[address]command

也可以将特定地址的多个命令分组

address {
    command1
    command2
    command3
}

1.数字方式的行寻址

执行命令

sed '2s/dog/cat/' data1.txt
sed '2,3s/dog/cat/' data1.txt
sed '2,$s/dog/cat/' data1.txt

2.使用文本模式过滤器

格式

/pattern/command

执行命令

sed '/zc/s/bash/csh/' /etc/passwd

pattern可以是固定文本,也可以是正则表达式

3.命令组合

执行命令

sed '2{s/fox/elephant/;s/dog/cat/}' data1.txt
sed '3,${s/brown/green/;s/lazy/active/}' data1.txt

19.2.3 删除行

执行命令

sed 'd' data1.txt
sed '3d' data1.txt
sed '2,3d' data1.txt
sed '3,$d' data1.txt

19.2.4 插入和附加功能

插入或附加数据

  • 插入(insert)命令(i)会在指定行前增加一个新行
  • 附加(append)命令(a)会在指定行后增加一个新行

执行命令

echo "Test line 2" | sed 'i\Test line 1'
echo "Test line 2" | sed 'a\Test line 1'

19.2.5 修改行

使用change命令修改数据流中整行文本的内容

编写data6.txt文件

This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.

执行命令

sed '3c\This is a changed line.' data6.txt 
sed '2,3c\This is a changed line.' data6.txt

19.2.6 转回命令

命令格式

[address]y/inchars/outchars

执行命令

sed 'y/123/789/' data6.txt

19.2.7 回顾打印

1.打印行

使用命令p打印文本行

执行命令

echo "this is a test" | sed 'p'
sed -n '/number 3/p' data6.txt

2.打印行号

使用等号=打印行号

执行命令

sed '=' data1.txt

3.列出行

使用小写的L列出行

执行命令

sed -n 'l' data1.txt

19.2.8 使用sed处理文件

1.写入文件

命令格式

[address]w filename

执行命令

sed '1,2w test.txt' data6.txt

2.从文件读取数据

使用命令r从文件中读取数据

[address]r filename

执行命令

sed '3r data1.txt' data6.txt

19.3 小结

本章主要讲解了使用sed编辑器来处理数据,及sed编辑器的一些处理数据的编辑命令


妙手空空
1.3k 声望370 粉丝

博观而约取,厚积而薄发